/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.consultorio.controle;

import br.com.consultorio.bean.Endereco;
import br.com.consultorio.bean.Funcao;
import br.com.consultorio.bean.Funcionario;
import br.com.consultorio.bean.Perfil;
import br.com.consultorio.bean.Usuario;
import br.com.consultorio.dao.EnderecoDao;
import br.com.consultorio.dao.EnderecoDaoImp;
import br.com.consultorio.dao.FuncaoDao;
import br.com.consultorio.dao.FuncaoDaoImp;
import br.com.consultorio.dao.FuncionarioDao;
import br.com.consultorio.dao.FuncionarioDaoImp;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author L3nfers
 */
@WebServlet(name = "ServletConsulta", urlPatterns = {"/ServletConsulta"})
public class ServletConsulta extends HttpServlet {

    private HttpServletRequest request;
    private HttpServletResponse response;
    private RequestDispatcher rd;
    private Funcionario funcionario;
    private Endereco endereco;
    private Funcao funcao;
    FuncionarioDao funcionarioDao;
    private FuncionarioDaoImp funcionarioDaoImp;

    protected void processRequest()
            throws ServletException, IOException {
        String cmd = request.getParameter("cmd");

        try {
            switch (cmd) {
                case "salvar":
                    salvar();
                    break;
                case "alterar":
                    alterar();
                    break;
                case "excluir":
                    excluir();
                    break;
                case "listar":
                    listar();
                    break;
                case "pFuncionario":
                    pesquisaFuncionario();
                    break;
                case "pFuncionarioNome":
                    pesquisaNomeFuncionario();
                    break;
                case "combo":
                    combo();
                    break;
            }
            rd.forward(request, response);
        } catch (Exception ex) {
            Logger.getLogger(ServletFuncionario.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.request = request;
        this.response = response;
        processRequest();
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.request = request;
        this.response = response;
        processRequest();
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private void salvar() {
        funcionarioDao = new FuncionarioDaoImp();
        try {
            funcionario = (Funcionario) carregaFuncionario();
            funcionarioDao.salvar(funcionario);
            request.setAttribute("msg", "Funcionário salvo com sucesso");
            rd = request.getRequestDispatcher("admin/pesqFuncionario.jsp");
        } catch (Exception e) {
            request.setAttribute("msg", "Erro ao salvar o funcionário Contate o Suporte Técnico"
                    + "\nDetalhes do erro: " + e);
            Logger.getLogger(ServletFuncionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    private void alterar() {
        funcionarioDao = new FuncionarioDaoImp();
        
        try {
            funcionario = (Funcionario) carregaAltFuncionario();
            funcionarioDao.alterar(funcionario);
            request.setAttribute("msg", "Funcionário alterado com sucesso");
            rd = request.getRequestDispatcher("admin/pesqFuncionario.jsp");
        } catch (Exception e) {
            request.setAttribute("msg", "Erro ao alterar o funcionário Contate o Suporte Técnico"
                    + "\nDetalhes do erro: " + e);
            Logger.getLogger(ServletFuncionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    private void excluir() {
        funcionarioDao = new FuncionarioDaoImp();
        int id = Integer.parseInt(request.getParameter("id"));
        try {
            funcionarioDao.excluir(id);
            request.setAttribute("msg", "Funcionário excluido com sucesso");
            rd = request.getRequestDispatcher("admin/pesqFuncionario.jsp");
        } catch (Exception e) {
            request.setAttribute("msg", "Erro ao excluir o funcionário Contate o Suporte Técnico"
                    + "\nDetalhes do erro: " + e);
            Logger.getLogger(ServletFuncionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    private void listar() {
        funcionarioDao = new FuncionarioDaoImp();


        try {
            List funcionarios = funcionarioDao.listar();
            request.setAttribute("funcionarios", funcionarios);
            rd = request.getRequestDispatcher("mostraFuncionarioTemplate.jsp");
        } catch (Exception e) {
            request.setAttribute("msg", "Erro ao listar os funcionários Contate o Suporte Técnico"
                    + "\nDetalhes do erro: " + e);
            Logger.getLogger(ServletFuncionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    private void pesquisaFuncionario() {
        funcionarioDao = new FuncionarioDaoImp();
        FuncaoDao funcaoDao = new FuncaoDaoImp();

        int idPessoa = Integer.parseInt(request.getParameter("id"));

        try {
            funcionario = (Funcionario) funcionarioDao.procurar(idPessoa);
            
             List funcoes = funcaoDao.listar();

            request.setAttribute("funcionario", funcionario);
            request.setAttribute("funcoes", funcoes);

            rd = request.getRequestDispatcher("admin/altFuncionario.jsp");
        } catch (Exception e) {
            request.setAttribute("msg", "Erro ao pesquisar o funcionário Contate o Suporte Técnico"
                    + "\nDetalhes do erro: " + e);
            Logger.getLogger(ServletFuncionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    private Object carregaFuncionario() throws ParseException, Exception {
        endereco = new Endereco();
        funcao = new Funcao();
        funcionario = new Funcionario();
        Perfil perfil = new Perfil();
        Usuario usuario = new Usuario();

        String id = request.getParameter("id");
        String dataString = request.getParameter("data");
        Date data = new SimpleDateFormat("dd/MM/yyyy").parse(dataString);

        if (id != null) {
            funcionario.setId(Integer.parseInt(id));
        }

        funcionario.setNome(request.getParameter("nome"));
        funcionario.setCpf(request.getParameter("cpf"));
        funcionario.setTelefone(request.getParameter("telefone"));
        funcionario.setEmail(request.getParameter("email"));
        funcionario.setDataNasc(data);
        funcionario.setSalario(Double.parseDouble(request.getParameter("salario")));

        endereco.setRua(request.getParameter("rua"));
        endereco.setCep(request.getParameter("cep"));
        endereco.setBairro(request.getParameter("bairro"));
        endereco.setCidade(request.getParameter("cidade"));
        endereco.setEstado(request.getParameter("estado"));
        funcionario.setEndereco(endereco);
        
        usuario.setLogin(request.getParameter("login"));
        usuario.setSenha(request.getParameter("senha"));
        perfil.setId(1);
        usuario.setPerfil(perfil);
        funcionario.setUsuario(usuario);

        funcao.setId(Integer.parseInt(request.getParameter("idFuncao")));
        funcionario.setFuncao(funcao);

        return funcionario;
    }
    
    private Object carregaAltFuncionario() throws ParseException, Exception {
        endereco = new Endereco();
        funcao = new Funcao();
        funcionario = new Funcionario();
        Perfil perfil = new Perfil();
        Usuario usuario = new Usuario();

        String id = request.getParameter("id");
        String dataString = request.getParameter("data");
        Date data = new SimpleDateFormat("dd/MM/yyyy").parse(dataString);

        if (id != null) {
            funcionario.setId(Integer.parseInt(id));
        }

        funcionario.setNome(request.getParameter("nome"));
        funcionario.setCpf(request.getParameter("cpf"));
        funcionario.setTelefone(request.getParameter("telefone"));
        funcionario.setEmail(request.getParameter("email"));
        funcionario.setDataNasc(data);
        funcionario.setSalario(Double.parseDouble(request.getParameter("salario")));
        
        endereco.setId(Integer.parseInt(request.getParameter("idEndereco")));
        endereco.setRua(request.getParameter("rua"));
        endereco.setCep(request.getParameter("cep"));
        endereco.setBairro(request.getParameter("bairro"));
        endereco.setCidade(request.getParameter("cidade"));
        endereco.setEstado(request.getParameter("estado"));
        funcionario.setEndereco(endereco);
        
        usuario.setLogin(request.getParameter("login"));
        usuario.setSenha(request.getParameter("senha"));
        perfil.setId(1);
        usuario.setPerfil(perfil);
        funcionario.setUsuario(usuario);

        funcao.setId(Integer.parseInt(request.getParameter("idFuncao")));
        funcionario.setFuncao(funcao);

        return funcionario;
    }

    private void combo() {
        FuncaoDao funcaoDao = new FuncaoDaoImp();
        try {
            List funcoes = funcaoDao.listar();
            request.setAttribute("funcoes", funcoes);
            rd = request.getRequestDispatcher("admin/cadFuncionario.jsp");
        } catch (Exception e) {
            Logger.getLogger(ServletFuncionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    private void pesquisaNomeFuncionario() {
        funcionarioDao = new FuncionarioDaoImp();
        FuncaoDao funcDao = new FuncaoDaoImp();

        String nome = request.getParameter("nome");

        try {
            List funcionarios = funcionarioDao.pesquisaPorNome(nome);
            List funcoes = funcDao.listar();
            
            if (funcionarios.isEmpty()) {
                request.setAttribute("msg", "Não existe esse funcionário nos resgistros do Sistema");
                rd = request.getRequestDispatcher("admin/pesqFuncionario.jsp");
            } else {
                request.setAttribute("funcionarios", funcionarios);
                request.setAttribute("funcoes", funcoes);
                rd = request.getRequestDispatcher("admin/pesqFuncionario.jsp");
            }

        } catch (Exception e) {
            request.setAttribute("msg", "Erro ao pesquisar o funcionário pelo nome Contate o Suporte Técnico"
                    + "\nDetalhes do erro: " + e);
            Logger.getLogger(ServletFuncionario.class.getName()).log(Level.SEVERE, null, e);
        }
    }
}
